Traductores e Intérpretes UCAB : Transformacion de Gramaticas
This page last changed on Oct 31, 2006 by juanca.
Gramáticas EquivalentesDos gramáticas G 1 y G 2 son equivalentes
si y solo si:
es decir, si ambas gramáticas generan el mismo lenguaje. Recursión IzquierdaUno de los problemas que encontramos al escribir un analizador sintáctico descendente son las producciones cuyos lados derechos comienzan por el mismo símbolo en el lado izquierdo:
ya que un analizador descendente basado en dicha gramática puede tomar la decisión de substituir el lado izquierdo por el lado derecho recursivo infinitamente.
Afortunadamente disponemos de un algoritmo para transformar gramáticas con recursión izquierda en gramáticas equivalentes sin dicha recursión. Eliminación de la Recursión IzquierdaLas producciones de la forma:
donde los βi son los lados derechos que no son recursivos por la izquierda, se transofrman en:
EjemploEn notación ANTLR:
Eliminamos la recursión izquierda así:
También, dado que ANTLR es una notación estilo BNF, podemos intiutivamente escribir:
Ejemplo del Libro del Dragón
que es recursiva izquierda, se transforma en:
Eliminación Total de la Recursión
EjemploLa siguiente gramática exhibe recursión izquierda indirecta:
Esto puede observarse al intentar hacer un Analisis Sintactico Descendente recursivo:
En este caso, S ⇒* Sβ (a partir de S se deriva una Forma Sentencial que comienza por el mismo no-terminal), lo cual indica que hay recursión izquierda (que es posible aplicar una misma serie de sustituciones de lados izquierdos por lados derechos indefinidamente). Los pasos para eliminar la recursión izquierda en la Gramatica dada son los siguientes:
Otra soluciónUna mejor solución se puede lograr dándose cuenta que la gramática con recursión izquierda indirecta es una Gramatica Regular. En particular, es una gramática lineal derecha, la cual tiene una gramática lineal izquierda equivalente que no es recursiva izquierda:
EjemploA veces, podemos eliminar la recursión izquierda usando otros mecanismos. Por ejemplo, cuando eliminamos la ambigüedad de la siguiente gramática, también eliminamos la recursión izquierda.
Usando la notación BNF de ANTLR, la gramática puede escribirse de esta forma:
Factorización IzquierdaUna manera en la que podemos hacer la simulación de un analizador sintáctico descendente más eficiente, es eliminando los prefijos comunes en los lados derechos de las producciones. Dada una gramática con producciones:
donde α es el prefijo común, y los δi son las producciones que no comparten el prefijo en cuestión, podemos factorizar los prefijos comunes en las producciones así:
Y transformar la gramática en:
Al eliminar los prefijos comunes ya no es necesario que las implementaciones de los lados derechos consuman varias veces el mismo prefijo en la búsqueda del lado derecho correcto. |
Document generated by Confluence on Oct 04, 2010 11:25 |